YOLOv7の実装を理解する(YOLOv7のコードを読んでみた)
こんちには。
データアナリティクス事業本部機械学習チームの中村です。
先日、YOLOv7に関するブログを2つ投稿しました。
今回はこの続編でソースコードを読んでみましたので、その内容について投稿します。
ソースコードは以下のリンクです。
ソースコード基本構成
YOLOv7のソースコードは、PyTorchで実装されています。
モデルサイズとしては7種類あり、それぞれがconfigファイルで定義されています。
またconfigファイルには前バージョン(YOLORやYOLOv4など)のもあり比較実行が可能です。
configファイルのモデル定義部分のフォーマットは以下となっています。
backbone: # [from, number, module, args] [[-1, 1, Conv, [32, 3, 1]], # 0 [-1, 1, Conv, [64, 3, 2]], # 1-P1/2 [-1, 1, Conv, [64, 3, 1]], [-1, 1, Conv, [128, 3, 2]], # 3-P2/4 [-1, 1, Conv, [64, 1, 1]], [-2, 1, Conv, [64, 1, 1]], [-1, 1, Conv, [64, 3, 1]], [-1, 1, Conv, [64, 3, 1]], [-1, 1, Conv, [64, 3, 1]], [-1, 1, Conv, [64, 3, 1]], [[-1, -3, -5, -6], 1, Concat, [1]], # ... ]
各行のルールは、["from(接続)", "number(繰り返し数)", "module(モジュール名), args("モジュールのパラメータ")]
という形で記述していきます。
from(接続)
は、相対的なインデックスと絶対的なインデックスで指定することが可能です。
各モジュールの定義は以下などに記述されています。
models/common.py
models/yolo.py
PyTorchが理解できていれば、コードリーディングは問題なく行えそうな印象です。
通常のGPU向け
モデルサイズは7種類がありますが、用途に応じてベースラインが3パターンありますので、それぞれのベースライン毎に仕様を確認していきます。
YOLOv7
通常のGPU向けには、YOLOv7がベースラインモデルとなります。
こちらが最も標準的な実装となり、以下の特徴があります。
- アーキテクチャはELANで構成
- ELANのconcat数は4つ
- 検出に使用する特徴量マップの解像度は1/8, 1/16, 1/32の3レベル
- 終盤の畳み込みにRepConvを使用
- 検出部はAuxiliary lossを使用しない
- 活性化関数はSiLUを使用
YOLOv7-X
YOLOv7-Xは、YOLOv7を提案手法でスケーリングしたものとなります。
YOLOv7と比較して以下の特徴があります。
- ELANのconcat数(depth)は5つに増加
- ELAN以外のconvのチャンネル数(width)は1.2倍に増加
- RepConvは使用しない
エッジGPU向け
YOLOv7-tiny
YOLOv7-tinyはエッジGPU向けのベースラインモデルとなります。
YOLOv7と比較して以下の特徴があります。
- ELANが通常と異なり簡易構成である
- 活性化関数も高速化のため、LeakyReLUに変更
- 全体的なノード数が少なく調整されている
簡易構成について補足します。通常のELANは以下の通りですが、、、
YOLOv7-tinyでは以下のように簡略化されています。
具体的に言うと、computation blockがそれぞれの接続で2層から1層に減っています。
これにより、よりエッジ処理に向けた高速化を実現しているようです。
エッジGPU向けはこのYOLOv7-tinyのみとなります。
クラウドGPU向け
YOLOv7-W6
YOLOv7-W6はクラウドGPU向け((サーバー向け?)のベースラインモデルとなります。
YOLOv7と比較して以下の特徴があります。
- 特徴量マップの解像度が1/8, 1/16, 1/32, 1/64の4レベルに増加
- 検出部にAuxiliary lossを使用する
- RepConvは使用しない
- 最初の畳み込み処理がReOrgに変更
- その他、widthやdepthはYOLOv7と同じ
ReOrgについて補足します。
ReOrgはYOLORでも実装されていましたが、縦横ピクセルを1つ飛ばしに取得して、チャンネル方向に重ね合わせることによりdownsampleする方法になります。
イメージ図としては以下のようになります。
YOLOv7-E6
YOLOv7-E6は、YOLOv7-W6を提案手法でスケーリングしたものとなります。
YOLOv7-W6と比較して以下の特徴があります。
- ELANのconcat数(depth)は5つに増加
- ELAN以外のconvのチャンネル数(width)は1.2倍に増加
YOLOv7-D6
YOLOv7-D6は、YOLOv7-W6を提案手法で2段階スケーリングしたものとなります。
YOLOv7-W6と比較して以下の特徴があります。
- ELANのconcat数(depth)は6つに増加
- ELAN以外のconvのチャンネル数(width)は1.44倍に増加
YOLOv7-E6E
YOLOv7-E6Eは、YOLOv7-E6に対して、E-ELANを適用したものとなります。
それ以外は、YOLOv7-E6と同じです。
これらを表にまとめると
サイズ | 説明 | 基本構造 | 活性化関数 | ELANのconcat数 | ノード数 | 特徴マップ解像度 | ReOrg有無 | RepConv有無 | Auxiliary loss |
---|---|---|---|---|---|---|---|---|---|
YOLOv7-tiny | エッジGPU向け | 簡易ELAN | LeakyReLU | 4 | 全体的に少ない | 1/8, 1/16, 1/32 | なし | なし | 未使用 |
YOLOv7 | 通常GPU向け | ELAN | SiLU | 4 | 基準 | 1/8, 1/16, 1/32 | なし | あり | 未使用 |
YOLOv7-X | 通常GPU向け | ELAN | SiLU | 5 | YOLOv7に対して1.2倍 | 1/8, 1/16, 1/32 | なし | なし | 未使用 |
YOLOv7-W6 | クラウドGPU向け | ELAN | SiLU | 4 | YOLOv7と同じ | 1/8, 1/16, 1/32, 1/64 | あり | なし | 使用 |
YOLOv7-E6 | クラウドGPU向け | ELAN | SiLU | 5 | YOLOv7に対して1.2倍 | 1/8, 1/16, 1/32, 1/64 | あり | なし | 使用 |
YOLOv7-D6 | クラウドGPU向け | ELAN | SiLU | 6 | YOLOv7に対して1.44倍 | 1/8, 1/16, 1/32, 1/64 | あり | なし | 使用 |
YOLOv7-E6E | クラウドGPU向け | E-ELAN | SiLU | 5 | YOLOv7に対して1.2倍 | 1/8, 1/16, 1/32, 1/64 | あり | なし | 使用 |
まとめ
いかがでしたでしょうか。論文に記載がない点もまとめられたので理解が深まりました。
本記事でYOLOv7についてはひとまず終わりですが、また記事にしたいものがあれば投稿したいと思います。
本記事が物体検出の理解の助けになれば幸いです。